/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import Utilidades.ExibirMensagens;
import Utilidades.VariaveisEstaticas;
import dominio.Cliente;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;

import javax.faces.bean.SessionScoped;

import negocio.ManterClienteNegocio;

/**
 *
 * @author Isaac Danilo
 * Classe usada para receber e fazer requisições com o servidor.
 */
@ManagedBean
@SessionScoped
public class ManterClienteBean {

    private ManterClienteNegocio manterClienteNegocio;
    private Cliente cliente;
    private String nome;
    private String cpfCnpj;
    private String telefone;
    private String celular;
    private String endereco;

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public String getCpfCnpj() {
        return cpfCnpj;
    }

    public void setCpfCnpj(String cpfCnpj) {
        this.cpfCnpj = cpfCnpj;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
    


    private boolean exibeTabela;
    /** Estrutura de dados usada para armazenar os clientes contidos no banco de dados<br>
     * Será usada para exibir a lista dos clientes na tela.
     */
    private List<Cliente> clientes;
    /** Variável que irá receber o valor false quando o usuário selecionar algum cliente.*/
    private boolean naoSelecionouCliente = true;

    public ManterClienteBean() {
        inicializarAtributos();
    }

    /**
     * Método que inicializa todos os atributos do ManterClienteBean
     */
    private void inicializarAtributos(){
        manterClienteNegocio = new ManterClienteNegocio();
        cliente = new Cliente();
        clientes = new ArrayList<Cliente>();
        nome = "";
        cpfCnpj = "";
        telefone = "";
        celular = "";
        endereco= "";


        exibeTabela = false;
    }

    /**
     * Método que irá chamar o método create() da classe ManterClienteNegócio.
     *
     */
    public void create() {
        /** Variável usada para receber o retorno do método create() da classe manterClienteNegócio.<br>
         * Esse retorno é usado para saber se o cliente foi armazenado ou não, distinguindo assim os possíveis erros.
         */

        int res = manterClienteNegocio.create(cliente);
        /** switch usado para mostrar a mensagem de inserção ao usário de acordo com o valor da
         * variável res.
         */
        exibeTabela = false;
        switch (res) {
            case VariaveisEstaticas.SUCESSO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(4), new Integer(0)});
                inicializarAtributos();

                break;
            case VariaveisEstaticas.ERRO_DUPLICACAO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(0), new Integer(5), new Integer(0)});
                break;
            case VariaveisEstaticas.ERRO_BD:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(1), new Integer(1), new Integer(1)});
                break;
        }
    }

    /**
     * Método que irá chamar o edit da classe manterClienteNegocio. É usado para editar um cliente.
     *
     */
    public void edit() {
        

        int res = manterClienteNegocio.edit(cliente);
        exibeTabela = false;
        switch (res) {
            case VariaveisEstaticas.SUCESSO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(4), new Integer(1)});

                naoSelecionouCliente = true;   // Caso ele consiga excluir o cliente, então essa variável irá receber true para desabilitar o botão.

                inicializarAtributos();
                break;

            case VariaveisEstaticas.ERRO_DUPLICACAO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(0), new Integer(5), new Integer(0)});
                break;
            case VariaveisEstaticas.ERRO_BD:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(1), new Integer(1), new Integer(1)});
                break;
        }
    }

    /**
     * Método que irá chamar o destroy() da classe manterClienteNegocio, será chamado para excluir um cliente.
     *
     */
    public void destroy() {
        int res = manterClienteNegocio.destroy(cliente);
        exibeTabela = false;
        switch (res) {
            case VariaveisEstaticas.SUCESSO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(4), new Integer(2)});

                naoSelecionouCliente = true;   // Caso ele consiga excluir o cliente, então essa variável irá receber true para desabilitar o botão.
                inicializarAtributos();
                //cliente = new Clientes();    // Zera todos os atributos do cliente para que os campos na página fiquem vazios.
                break;
            case VariaveisEstaticas.ERRO_BD:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(1), new Integer(1), new Integer(1)});
                break;
        }
    }

    /** Método que tem a função de buscar todos os clientes no BD e armazena-los na estrutura clientes*/
    public void findClienteEntities() {
        exibeTabela = true;
        clientes = manterClienteNegocio.findClienteEntities();

    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public List<Cliente> getClientes() {
        return clientes;
    }

   


    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    

    public boolean isExibeTabela() {
        return exibeTabela;
    }

    public void setExibeTabela(boolean exibeTabela) {
        this.exibeTabela = exibeTabela;
    }

    public boolean isNaoSelecionouCliente() {
        return naoSelecionouCliente;
    }

    public void setNaoSelecionouCliente(boolean naoSelecionouCliente) {
        this.naoSelecionouCliente = naoSelecionouCliente;
    }
}
